home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / lzsfx.com / LZSFX.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-02-02  |  3.7 KB  |  125 lines

  1. program LZSFX;
  2. (* ---------------
  3. #  LZSS self extract by MASSAN
  4.  
  5.  $Log: RCS/lzsfx.pas $
  6.   revision 1.4 MAS 89/02/02 03:46:31
  7.   bug fixed. (calc page size)
  8.   
  9. # revision 1.3 MAS 88/07/10 21:48:55
  10. # not directly change code segment.
  11. # revision 1.2 MAS 88/06/18 22:04:00
  12. # change to make .EXE file.
  13. # arg 2 = destin file.
  14. # revision 1.1 MAS 88/05/22 20:08:48
  15. # Initial revision
  16.    -----------------*)
  17. const
  18.   _header: string[80] = '$Header: RCS/lzsfx.pas 1.4 89/02/02 03:46:31 MAS Exp $';
  19.   pathlen = 64 ;  { MS-DOS}
  20.   maxstr = 255 ;
  21.   texbufsize = 1024;
  22. type
  23.   tex    = text;
  24.   anystr = string;
  25.   pathtype = string[pathlen];
  26. {$i open.prc}
  27. const
  28.     bufsize = 4096;
  29. var f,ouf: file;
  30.     fname,oufname: pathtype;
  31.     size : integer;
  32.     buf : array[1..bufsize] of byte;
  33.  
  34. procedure LZStub; external;
  35. {$L LZSTUB.BOB}
  36. procedure LZStubJr; external;   (* small size version *)
  37. {$L LZSTUBJR.BOB}
  38.  
  39.  
  40. procedure WriteHeader;
  41.   const headmin   = 32;           (* minimum size of header *)
  42.   type exehead= record case Boolean of
  43.     true:(
  44.         id : array[1..2] of char; (* MZ *)
  45.         lastbyte, page,           (* module size = (page-1)*512+lastbyte*)
  46.                                   (* cf. GetExeLen *)
  47.         relnum,                   (* # of relocation table *)
  48.         headsize,                 (* size of header *)
  49.         minalloc, maxalloc,       (* free area size *)
  50.         ss, sp,                   (* initial value of stack *)
  51.         checksum,                 (* ignore it *)
  52.         ip, cs,                   (* initial value of pc    *)
  53.         relofs, overlaynum        (* ignore it *)
  54.         : word);
  55.     false:(a: array[0..513] of byte);
  56.       end ;
  57.  
  58.   procedure GetExeLen(var h:exehead; var exestart,exelen:integer);
  59.     begin
  60.       with h do begin
  61.         exestart := headsize shl 4;
  62.         if lastbyte = 0 then exelen := page shl 9 - exestart
  63.                         else exelen := (page-1) shl 9 +lastbyte-exestart
  64.       end
  65.     end ;
  66.   
  67.     var exeptr,exenew: ^exehead;
  68.       exestart,exelen: integer;
  69.       modulesize: longint;
  70.   begin
  71.     exeptr := Addr(LZStubJr);
  72.     GetExeLen(exeptr^, exestart,exelen);
  73.     modulesize := FileSize(f) + exelen + 1;     (* 1 for end mark *)
  74.     if modulesize >= $ffff then begin
  75.       exeptr := Addr(LZStub);
  76.       GetExeLen(exeptr^, exestart, exelen);
  77.       modulesize := FileSize(f) + exelen + 1
  78.     end;
  79.     GetMem(exenew, exelen+headmin);
  80. (* ╤└▐┼ reloc.ª ╩╠▐▓├ ║╦▀░ *)
  81.     Move(exeptr^, exenew^, headmin);
  82.     Move(exeptr^.a[exestart], exenew^.a[headmin], exelen);
  83.  
  84.     with exenew^ do begin
  85.       headsize := headmin shr 4 ;
  86.       page     := (modulesize + headmin) shr 9 + 1;
  87.       lastbyte := (modulesize + headmin) and 511;
  88.       ss       := (modulesize + 15) shr 4
  89.     end;
  90.     BlockWrite(ouf, exenew^, exelen+headmin);
  91.     FreeMem(exenew, exelen+headmin)
  92.   end;
  93.  
  94.  
  95. begin
  96.   if ParamCount < 1 then begin
  97.     WriteLn('usage: LZSFX source[.LZS] [destin[.EXE]]'); Halt(1)
  98.   end;
  99. {$i-}
  100.   fname := NewFname(ParamStr(1),'LZS','+');
  101.   Assign(f, fname);  Reset(f, 1);  if IOresult <> 0 then CantHalt(fname);
  102.  
  103.   if ParamCount > 1 then oufname := NewFname(ParamStr(2),'EXE','-')
  104.                     else oufname := NewFname(fname,'EXE','-');
  105.  
  106.   if FileExist(oufname) then begin
  107.     WriteLn('File ', oufname, ' already exists'); Halt(1)
  108.   end;
  109.   Assign(ouf, oufname); Rewrite(ouf, 1); if IOresult <> 0 then CantHalt(fname);
  110. {$i+}
  111.   Write('Creating SFX file ', oufname);
  112.  
  113.   WriteHeader;
  114.   while not Eof(f) do begin
  115.     BlockRead(f, buf, SizeOf(buf), size);
  116.     BlockWrite(ouf, buf, size)
  117.   end;
  118.   buf[1] := 0; BlockWrite(ouf, buf[1], 1);    (* end mark *)
  119.   Close(f); Close(ouf);
  120.   WriteLn
  121. end.
  122.